{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "87545236",
   "metadata": {},
   "source": [
    "有监督学习，主要对有标签的数据集（即有“参考答案”）去构建机器学习模型，但在实际的生产环境中，其实大量数据是处于没有被标注的状态，这时因为“贴标签”的工作需要耗费大量的人力，如果数据量巨大，或者调研难度大的话，生产出一份有标签的数据集是非常困难的。再者就算是使用人工来标注，标注的速度也会比数据生产的速度慢的多。因此要想对没有被标注的数据进行分类，就要使用无监督学习算法。\n",
    "\n",
    "常见的无监督学习算法，包括 K-means 聚类算法、均值漂移聚类算法、主成分分析法（即 PCA 算法）、EM算法（期望最大化算法）等。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9558e733",
   "metadata": {},
   "source": [
    "## 聚类和分类的区别\n",
    "\n",
    "聚类算法与分类算法的最终的目的都是将数据区分开来，但是两者的实现过程完全不同。分类问题，通过对已有标签的数据进行训练来确定最佳预测模型，然后对新样本的所属类别进行预测，在这个过程中算法模型只要尽可能的实现最佳拟合就 OK 了。与分类问题不同，聚类问题没有任何标签，可谓是一遍茫然，就像做练习题没有参考答案一样，不知道自己做的是否正确。在这种情况下，如果您想证明自己做的题目是否对，在没有参考答案的情况下，您会怎么做呢？没错，您可以多找同学几位同学，甚至找全班同学去对比。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "25f4a25e",
   "metadata": {},
   "source": [
    "## 找相似\n",
    "聚类算法在实现分类时，只能尽可能找相同点，相同点越多，说明他们就属于同一类，而不同点越多，就说明两者不是同一类。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b218cefe",
   "metadata": {},
   "source": [
    "## 簇是什么\n",
    "在聚类问题中，有一个非常重要的概念“簇”（Cluster），那到底什么是簇呢，样本数据集通过聚类算法最终会聚集成一个个“类”，这些类在机器学习中的术语称为“簇”（注意，这里的前提是使用“聚类算法”）\n",
    "\n",
    "举个简单的例子：有同样大小的正方形和圆形各 3 个，每个方形和圆形的颜色两两相同，分别是黄色、红色、绿色，如果按照形状分类的话，可以分为圆形和正方形两个簇，如果按照颜色分类的话，可以分为黄色、红色、绿色三个簇。由此可见选择的分簇条件不同，形成的簇的数量也不同，从而聚类的结果也不同。\n",
    "\n",
    "不同聚类算法采取了不同的思路，主要分为划分法、层次法、密度法和网格法，这些方法大致可总结为两类，一类是预先设定有多少个簇，另一类则是在聚类的过程中形成。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2a6965f5",
   "metadata": {},
   "source": [
    "## 理解K的含义\n",
    "K-means 就是一种采用了划分法的聚类算法，K-means 聚类算法与前面的 KNN 分类算法一样，都带有字母“K”，前面我们说过，机器学习喜欢用字母“K”来表示“多”，就像数学中常用字母“n”来表示是同样的道理，但 K-means 中的 K 究竟是什么意思呢？不妨先回顾一下 KNN 分类算法中的 K。\n",
    "\n",
    "我们知道，KNN 分类算法采用了“多数表决的方法”，最终样本类能够完成分类，完全依赖于该方法，比如 KNN 中的 K 表示有多少个样本点参与表决，这里的 K 对于样本的分类起到了关键性的作用，因此可以换个说法，多数表决是需要限定在 K 规定范围内的。\n",
    "\n",
    "再说 K-means 中的 K，由于该算法是没有参考标准的。如果不加以限定的话，它会形多任意数量的“簇”，这就要求我们要预先设定“簇”的数量，就像田忌赛马一样，根据马的自身的特点，将其分为上、中、下三个档次，因此 K-means 中 K 是聚集成几个“簇”，形成几个“类”的意思。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "349feb59",
   "metadata": {},
   "source": [
    "## 如何量化“相似”\n",
    "前面我们提到过解决“聚类问题”的关键是找到“相似”之处，只有找到了相同点才可以实现类别的划分，说的直白一点，聚类的过程就是让相似的样本互相抱团的过程。\n",
    "\n",
    "不妨先回顾一下 KNN 最近邻分类算法，该算法以待分类样本点为中心，通过度量距离找出与其最近邻的 K 个样本点，哪个类别的样本点数量多，那么就认为待分类的样本点属于哪一类。在这个过程中有两点是解决分类问题的关键，一是以待分类样本为“中心点”；二是通过度量距离来确定 K 个最邻近中心的样本点，从而找到哪几个样本点拥有表决权。\n",
    "\n",
    "在聚类算法中“相似”其实并不是一个具体的指标，就像“人以群分”这句成语，它没有提供具体的划分标准，即“以什么分”，可能是性格、爱好，也可能是志向，甚至是人的高低贵贱，因此量化相似也要根据具体的场景，也就是确定比较的标准（即度量相似的标准）。\n",
    "\n",
    "K-means 聚类算法与 KNN 算法有许多相似之处（即使在本质它们并不相同），KNN 通过度量距离确定距离自己最近的“朋友圈”，其实换个角度来看的话，这个“朋友圈”就相当于 K-means 中的“簇”，因此我们可以采用与 KNN 相同的度量工具作为量化“相似”的标准。\n",
    "\n",
    "#### （1）随机选择质心\n",
    "从 KNN 解决分类问题的过程不难看出，要想解决 K-means 聚类问题，同样需要一个“中心点”。\n",
    "\n",
    "假设聚类问题的样本数据也能找出 K 个中心点，就能以该点为中心，以距离为度量画出范围来，将同一范围内的样本点作为一个簇，从而解决聚类问题，在 K-means 聚类算法中，这样的中心点称为“质心”。\n",
    "\n",
    "聚类算法是无监督学习，因此数据中的样本点完全不知道自己属于哪一个簇， 就更别谈缺点“质心”了，为了解决这一问题，K-means 算法通过随机选择方式来确定质心，但由于是随机选择，因此无法保证随机选择的 K 个质心就恰好是完成聚类后的 K 个簇的中心点，这时就用到了“mean”，它是“均值”的意思，通过均值可以不断的调整质心，由此可知质心在 K-means 算法中是不断改变的。\n",
    "\n",
    "#### （2）求出新质心点\n",
    "假设现在随机了 K 个质心得到了 K 个簇，接下来要怎样让这 K 个簇形成新的质心呢？做法有很多，K-means 算法选择了最简单的一种，求平均。\n",
    "\n",
    "每个簇都有若干数据点，求出这些数据点的坐标值均值，就得到了新质心的坐标点，比如一个簇中有三个数据点，分别 (3,2)，(3,1)，(2,3)，那么新质心点位于：\n",
    "```\n",
    "x：(3+3+2)/3 约等于 2.666\n",
    "y：(2+1+3)/3 = 2\n",
    "质心坐标：(2.666,2)\n",
    "```\n",
    "在 K-means 聚类的过程中会经历多次质心计算，数据点到底归属于哪个簇可能会频繁变动，比如同一个数据点可能在本轮与一群样本点进行簇 A 的质心计算，而在下一轮就与另一群样本点进行簇 B 的质心计算，这也是 K-means 算法与 KNN 算法最大的不同之处。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ceae235f",
   "metadata": {},
   "source": [
    "## 算法应用场景\n",
    "适合于解决而特征维度为数值型的聚类问题。\n",
    "\n",
    "例子，一个赛季结束后，篮球队要对队员的整体表现进行聚类分析，此时每位队员的特征维度都是可以量化的，比如某队员的上场时间、得分数、助攻数、失误数等。\n",
    "\n",
    "K-means 算法也适用于文本聚类，比如新闻网站会将相同话题的新闻聚集在一起，并自动生成一个个不同话题的新闻专栏，其实这就是利用聚类算法实现的，但是文本的特征维度并非数值类型，因此需要对其进行数值转化操作，将文本数据转换为数学信息，此时可以使用 TF-IDF 加权技术计算单个词的权值。\n",
    "\n",
    "- 优点：原理简单，实现容易，运算效率高。\n",
    "- 不足：需要人为设置簇的个数与随机初始化质心点可能影响聚类的最终效果，同时 K-measn 算法对孤立点（离群点）特别敏感，会对最终的聚类结果产生明显扰动。\n",
    "- 应用领域：适用于特征维度为数据类型的聚类问题，比如体育赛事等，而对特征维度不是数据类型的需要提前进行转换，比如文本分类等。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a9516408",
   "metadata": {},
   "source": [
    "## sklearn 使用k-means算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e5d72c59",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'data': array([[5.1, 3.5, 1.4, 0.2],\n",
      "       [4.9, 3. , 1.4, 0.2],\n",
      "       [4.7, 3.2, 1.3, 0.2],\n",
      "       [4.6, 3.1, 1.5, 0.2],\n",
      "       [5. , 3.6, 1.4, 0.2],\n",
      "       [5.4, 3.9, 1.7, 0.4],\n",
      "       [4.6, 3.4, 1.4, 0.3],\n",
      "       [5. , 3.4, 1.5, 0.2],\n",
      "       [4.4, 2.9, 1.4, 0.2],\n",
      "       [4.9, 3.1, 1.5, 0.1],\n",
      "       [5.4, 3.7, 1.5, 0.2],\n",
      "       [4.8, 3.4, 1.6, 0.2],\n",
      "       [4.8, 3. , 1.4, 0.1],\n",
      "       [4.3, 3. , 1.1, 0.1],\n",
      "       [5.8, 4. , 1.2, 0.2],\n",
      "       [5.7, 4.4, 1.5, 0.4],\n",
      "       [5.4, 3.9, 1.3, 0.4],\n",
      "       [5.1, 3.5, 1.4, 0.3],\n",
      "       [5.7, 3.8, 1.7, 0.3],\n",
      "       [5.1, 3.8, 1.5, 0.3],\n",
      "       [5.4, 3.4, 1.7, 0.2],\n",
      "       [5.1, 3.7, 1.5, 0.4],\n",
      "       [4.6, 3.6, 1. , 0.2],\n",
      "       [5.1, 3.3, 1.7, 0.5],\n",
      "       [4.8, 3.4, 1.9, 0.2],\n",
      "       [5. , 3. , 1.6, 0.2],\n",
      "       [5. , 3.4, 1.6, 0.4],\n",
      "       [5.2, 3.5, 1.5, 0.2],\n",
      "       [5.2, 3.4, 1.4, 0.2],\n",
      "       [4.7, 3.2, 1.6, 0.2],\n",
      "       [4.8, 3.1, 1.6, 0.2],\n",
      "       [5.4, 3.4, 1.5, 0.4],\n",
      "       [5.2, 4.1, 1.5, 0.1],\n",
      "       [5.5, 4.2, 1.4, 0.2],\n",
      "       [4.9, 3.1, 1.5, 0.2],\n",
      "       [5. , 3.2, 1.2, 0.2],\n",
      "       [5.5, 3.5, 1.3, 0.2],\n",
      "       [4.9, 3.6, 1.4, 0.1],\n",
      "       [4.4, 3. , 1.3, 0.2],\n",
      "       [5.1, 3.4, 1.5, 0.2],\n",
      "       [5. , 3.5, 1.3, 0.3],\n",
      "       [4.5, 2.3, 1.3, 0.3],\n",
      "       [4.4, 3.2, 1.3, 0.2],\n",
      "       [5. , 3.5, 1.6, 0.6],\n",
      "       [5.1, 3.8, 1.9, 0.4],\n",
      "       [4.8, 3. , 1.4, 0.3],\n",
      "       [5.1, 3.8, 1.6, 0.2],\n",
      "       [4.6, 3.2, 1.4, 0.2],\n",
      "       [5.3, 3.7, 1.5, 0.2],\n",
      "       [5. , 3.3, 1.4, 0.2],\n",
      "       [7. , 3.2, 4.7, 1.4],\n",
      "       [6.4, 3.2, 4.5, 1.5],\n",
      "       [6.9, 3.1, 4.9, 1.5],\n",
      "       [5.5, 2.3, 4. , 1.3],\n",
      "       [6.5, 2.8, 4.6, 1.5],\n",
      "       [5.7, 2.8, 4.5, 1.3],\n",
      "       [6.3, 3.3, 4.7, 1.6],\n",
      "       [4.9, 2.4, 3.3, 1. ],\n",
      "       [6.6, 2.9, 4.6, 1.3],\n",
      "       [5.2, 2.7, 3.9, 1.4],\n",
      "       [5. , 2. , 3.5, 1. ],\n",
      "       [5.9, 3. , 4.2, 1.5],\n",
      "       [6. , 2.2, 4. , 1. ],\n",
      "       [6.1, 2.9, 4.7, 1.4],\n",
      "       [5.6, 2.9, 3.6, 1.3],\n",
      "       [6.7, 3.1, 4.4, 1.4],\n",
      "       [5.6, 3. , 4.5, 1.5],\n",
      "       [5.8, 2.7, 4.1, 1. ],\n",
      "       [6.2, 2.2, 4.5, 1.5],\n",
      "       [5.6, 2.5, 3.9, 1.1],\n",
      "       [5.9, 3.2, 4.8, 1.8],\n",
      "       [6.1, 2.8, 4. , 1.3],\n",
      "       [6.3, 2.5, 4.9, 1.5],\n",
      "       [6.1, 2.8, 4.7, 1.2],\n",
      "       [6.4, 2.9, 4.3, 1.3],\n",
      "       [6.6, 3. , 4.4, 1.4],\n",
      "       [6.8, 2.8, 4.8, 1.4],\n",
      "       [6.7, 3. , 5. , 1.7],\n",
      "       [6. , 2.9, 4.5, 1.5],\n",
      "       [5.7, 2.6, 3.5, 1. ],\n",
      "       [5.5, 2.4, 3.8, 1.1],\n",
      "       [5.5, 2.4, 3.7, 1. ],\n",
      "       [5.8, 2.7, 3.9, 1.2],\n",
      "       [6. , 2.7, 5.1, 1.6],\n",
      "       [5.4, 3. , 4.5, 1.5],\n",
      "       [6. , 3.4, 4.5, 1.6],\n",
      "       [6.7, 3.1, 4.7, 1.5],\n",
      "       [6.3, 2.3, 4.4, 1.3],\n",
      "       [5.6, 3. , 4.1, 1.3],\n",
      "       [5.5, 2.5, 4. , 1.3],\n",
      "       [5.5, 2.6, 4.4, 1.2],\n",
      "       [6.1, 3. , 4.6, 1.4],\n",
      "       [5.8, 2.6, 4. , 1.2],\n",
      "       [5. , 2.3, 3.3, 1. ],\n",
      "       [5.6, 2.7, 4.2, 1.3],\n",
      "       [5.7, 3. , 4.2, 1.2],\n",
      "       [5.7, 2.9, 4.2, 1.3],\n",
      "       [6.2, 2.9, 4.3, 1.3],\n",
      "       [5.1, 2.5, 3. , 1.1],\n",
      "       [5.7, 2.8, 4.1, 1.3],\n",
      "       [6.3, 3.3, 6. , 2.5],\n",
      "       [5.8, 2.7, 5.1, 1.9],\n",
      "       [7.1, 3. , 5.9, 2.1],\n",
      "       [6.3, 2.9, 5.6, 1.8],\n",
      "       [6.5, 3. , 5.8, 2.2],\n",
      "       [7.6, 3. , 6.6, 2.1],\n",
      "       [4.9, 2.5, 4.5, 1.7],\n",
      "       [7.3, 2.9, 6.3, 1.8],\n",
      "       [6.7, 2.5, 5.8, 1.8],\n",
      "       [7.2, 3.6, 6.1, 2.5],\n",
      "       [6.5, 3.2, 5.1, 2. ],\n",
      "       [6.4, 2.7, 5.3, 1.9],\n",
      "       [6.8, 3. , 5.5, 2.1],\n",
      "       [5.7, 2.5, 5. , 2. ],\n",
      "       [5.8, 2.8, 5.1, 2.4],\n",
      "       [6.4, 3.2, 5.3, 2.3],\n",
      "       [6.5, 3. , 5.5, 1.8],\n",
      "       [7.7, 3.8, 6.7, 2.2],\n",
      "       [7.7, 2.6, 6.9, 2.3],\n",
      "       [6. , 2.2, 5. , 1.5],\n",
      "       [6.9, 3.2, 5.7, 2.3],\n",
      "       [5.6, 2.8, 4.9, 2. ],\n",
      "       [7.7, 2.8, 6.7, 2. ],\n",
      "       [6.3, 2.7, 4.9, 1.8],\n",
      "       [6.7, 3.3, 5.7, 2.1],\n",
      "       [7.2, 3.2, 6. , 1.8],\n",
      "       [6.2, 2.8, 4.8, 1.8],\n",
      "       [6.1, 3. , 4.9, 1.8],\n",
      "       [6.4, 2.8, 5.6, 2.1],\n",
      "       [7.2, 3. , 5.8, 1.6],\n",
      "       [7.4, 2.8, 6.1, 1.9],\n",
      "       [7.9, 3.8, 6.4, 2. ],\n",
      "       [6.4, 2.8, 5.6, 2.2],\n",
      "       [6.3, 2.8, 5.1, 1.5],\n",
      "       [6.1, 2.6, 5.6, 1.4],\n",
      "       [7.7, 3. , 6.1, 2.3],\n",
      "       [6.3, 3.4, 5.6, 2.4],\n",
      "       [6.4, 3.1, 5.5, 1.8],\n",
      "       [6. , 3. , 4.8, 1.8],\n",
      "       [6.9, 3.1, 5.4, 2.1],\n",
      "       [6.7, 3.1, 5.6, 2.4],\n",
      "       [6.9, 3.1, 5.1, 2.3],\n",
      "       [5.8, 2.7, 5.1, 1.9],\n",
      "       [6.8, 3.2, 5.9, 2.3],\n",
      "       [6.7, 3.3, 5.7, 2.5],\n",
      "       [6.7, 3. , 5.2, 2.3],\n",
      "       [6.3, 2.5, 5. , 1.9],\n",
      "       [6.5, 3. , 5.2, 2. ],\n",
      "       [6.2, 3.4, 5.4, 2.3],\n",
      "       [5.9, 3. , 5.1, 1.8]]), 'target': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
      "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
      "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
      "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]), 'frame': None, 'target_names': array(['setosa', 'versicolor', 'virginica'], dtype='<U10'), 'DESCR': '.. _iris_dataset:\\n\\nIris plants dataset\\n--------------------\\n\\n**Data Set Characteristics:**\\n\\n    :Number of Instances: 150 (50 in each of three classes)\\n    :Number of Attributes: 4 numeric, predictive attributes and the class\\n    :Attribute Information:\\n        - sepal length in cm\\n        - sepal width in cm\\n        - petal length in cm\\n        - petal width in cm\\n        - class:\\n                - Iris-Setosa\\n                - Iris-Versicolour\\n                - Iris-Virginica\\n                \\n    :Summary Statistics:\\n\\n    ============== ==== ==== ======= ===== ====================\\n                    Min  Max   Mean    SD   Class Correlation\\n    ============== ==== ==== ======= ===== ====================\\n    sepal length:   4.3  7.9   5.84   0.83    0.7826\\n    sepal width:    2.0  4.4   3.05   0.43   -0.4194\\n    petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)\\n    petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)\\n    ============== ==== ==== ======= ===== ====================\\n\\n    :Missing Attribute Values: None\\n    :Class Distribution: 33.3% for each of 3 classes.\\n    :Creator: R.A. Fisher\\n    :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)\\n    :Date: July, 1988\\n\\nThe famous Iris database, first used by Sir R.A. Fisher. The dataset is taken\\nfrom Fisher\\'s paper. Note that it\\'s the same as in R, but not as in the UCI\\nMachine Learning Repository, which has two wrong data points.\\n\\nThis is perhaps the best known database to be found in the\\npattern recognition literature.  Fisher\\'s paper is a classic in the field and\\nis referenced frequently to this day.  (See Duda & Hart, for example.)  The\\ndata set contains 3 classes of 50 instances each, where each class refers to a\\ntype of iris plant.  One class is linearly separable from the other 2; the\\nlatter are NOT linearly separable from each other.\\n\\n.. topic:: References\\n\\n   - Fisher, R.A. \"The use of multiple measurements in taxonomic problems\"\\n     Annual Eugenics, 7, Part II, 179-188 (1936); also in \"Contributions to\\n     Mathematical Statistics\" (John Wiley, NY, 1950).\\n   - Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.\\n     (Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.\\n   - Dasarathy, B.V. (1980) \"Nosing Around the Neighborhood: A New System\\n     Structure and Classification Rule for Recognition in Partially Exposed\\n     Environments\".  IEEE Transactions on Pattern Analysis and Machine\\n     Intelligence, Vol. PAMI-2, No. 1, 67-71.\\n   - Gates, G.W. (1972) \"The Reduced Nearest Neighbor Rule\".  IEEE Transactions\\n     on Information Theory, May 1972, 431-433.\\n   - See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al\"s AUTOCLASS II\\n     conceptual clustering system finds 3 classes in the data.\\n   - Many, many more ...', 'feature_names': ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'], 'filename': 'iris.csv', 'data_module': 'sklearn.datasets.data'}\n",
      "(150, 2)\n",
      "[5.1 3.5]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 26410 (\\N{CJK UNIFIED IDEOGRAPH-672A}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 32858 (\\N{CJK UNIFIED IDEOGRAPH-805A}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 31867 (\\N{CJK UNIFIED IDEOGRAPH-7C7B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 20043 (\\N{CJK UNIFIED IDEOGRAPH-4E4B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 21069 (\\N{CJK UNIFIED IDEOGRAPH-524D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 33457 (\\N{CJK UNIFIED IDEOGRAPH-82B1}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 33852 (\\N{CJK UNIFIED IDEOGRAPH-843C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 38271 (\\N{CJK UNIFIED IDEOGRAPH-957F}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 24230 (\\N{CJK UNIFIED IDEOGRAPH-5EA6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 23485 (\\N{CJK UNIFIED IDEOGRAPH-5BBD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 31639 (\\N{CJK UNIFIED IDEOGRAPH-7B97}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 27861 (\\N{CJK UNIFIED IDEOGRAPH-6CD5}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 32467 (\\N{CJK UNIFIED IDEOGRAPH-7ED3}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/Users/mac/opt/anaconda3/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 26524 (\\N{CJK UNIFIED IDEOGRAPH-679C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHFCAYAAAAOmtghAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB6aUlEQVR4nO3deXxU5d3//9dMAmELCYIQNg2LgoAKCkoUFBdAUYHW4m0rRVzaLy2i1ttbxbpbi73b+76t2pafu4iiVhRxB2RRNAgIIiBSQILIWkQICCQkc35/XNkmOTNzZubM/n4+HnloDtc51zVzkjOfnOV6eyzLshARERFJE95ED0BERETETSpuREREJK2ouBEREZG0ouJGRERE0oqKGxEREUkrKm5EREQkrai4ERERkbSi4kZERETSioobERERSSvZiR6AJLd169ZRVFQUtM3HH3/M4MGDg7ZZtmwZFRUVIbcVi3YnnHBC0DYiIpJedOZGgqqsrKRPnz7s27fP9qtPnz54PJ6QbSorKx1tKxbtRCR6zz33HB6Ph+XLl/st37NnD/3796dFixbMnTu3wXolJSV4PB48Hg/33Xef7bavvfbamjap4rzzziM/Pz/g1/33359W7VKNztyIiEhEvvvuO4YOHcquXbuYN28eAwcODNg2NzeX5557jnvuuQevt/bv6oMHD/LPf/6Tli1bUlpaGo9hu+LAgQMsX76c7t27N/i3p556io0bN6ZVu1SjMzciIhK2DRs2cPbZZ7N//34WLVoUtLAB+I//+A+2bNnChx9+6Lf8lVdeobKykpEjR8ZyuJJhVNyIiEhYvvjiCwYNGkR2djaLFy/m5JNPDrlOjx49OOuss3jmmWf8lj/zzDP89Kc/JS8vz3a9V155haKiIpo3b06LFi0YPnw4K1eu9GuzfPlyrrzySgoLC2natCmFhYX8/Oc/Z8uWLX7tqi+tLViwgN/85je0adOG1q1b89Of/pTt27f7tZ0/fz5DhgyhdevWNG3alOOOO47LL7+cQ4cOOXmLJMFU3IiIiGOLFy9myJAhtG3blsWLF9O1a1fH61533XXMmjWLH374AYD169fz6aefct1119m2/+Mf/8jPf/5zevXqxauvvsoLL7zAgQMHGDx4MF999VVNu5KSEnr06MEjjzzCBx98wJ/+9Cd27NjBgAED2LNnT4PtXn/99TRq1IiXXnqJ//7v/2bhwoWMHTvWb3uXXHIJjRs35plnnuH999/n4Ycfpnnz5pSXlzt+vZI4uudGREQc+93vfkdeXh7z58/n2GOPDWvdK664gptuuomXXnqJiRMn8vTTT9OlSxeGDBnCzJkz/dpu3bqVe++9lxtuuIFHH320ZvnQoUM54YQTuP/++3nllVcA+NnPfsbPfvazmjaVlZVceumltGvXjpdeeokbb7zRb9sXXXSR3zb37t3Lbbfdxs6dOykoKODzzz/nyJEj/PnPf+bUU0+tafeLX/wirNcriaMzNyIi4tjIkSPZv38/N998s9/TiBUVFX5flmU1WLdFixaMGTOGZ555hoqKCqZNm8Y111xj+5TUBx98QEVFBePGjfPbbpMmTTj33HNZuHBhTduDBw9y++230717d7Kzs8nOzqZFixb8+OOPrFu3zvY11HXKKacA1FzG6tu3L40bN+bXv/41zz//PN98801E75UkjoobERFx7O677+aee+7hpZdeYuzYsTUFTqNGjfy+nn/+edv1r7vuOlasWMFDDz3Ev//9b8aPH2/bbteuXQAMGDCgwbZfeeUVv8tNv/jFL3j88ce5/vrr+eCDD1i6dCnLli3j2GOP5fDhww223bp1a7/vc3JyAGraduvWjXnz5tG2bVsmTpxIt27d6NatG3/961/De7MkYXRZSkREwnL//ffj8Xi4//778fl8vPjiiyxbtsyvTZcuXWzXPfvss+nRowcPPPAAQ4cOpXPnzrbt2rRpA8Brr73G8ccfH3As+/fv5+233+bee+/ljjvuqFleVlbG3r17w31pNQYPHszgwYOprKxk+fLlPPbYY9x88820a9eOK6+8MuLtSnyouBERkbDdd999eL1e7r33XizL4qWXXiI729lHyl133cVrr73GxIkTA7YZPnw42dnZbNq0icsvvzxgO4/Hg2VZNWdfqj311FOuTOKZlZXFmWeeSc+ePXnxxRdZsWKFipsUoOJGREQiUj0h3913341lWcyYMcNRgTN27Fi/p5PsFBYW8sADD/D73/+eb775hosuuohWrVqxa9culi5dSvPmzbn//vtp2bIl55xzDn/+859p06YNhYWFLFq0iKeffpr8/PyIXtfUqVOZP38+l1xyCccddxxHjhypeYT9wgsvjGibEl8qbkREJGJ33XUXXq+X3//+9/h8Pl5++WUaNWrkyrYnT55Mr169+Otf/8qMGTMoKyujoKCAAQMGMGHChJp2L730EjfddBO33XYbFRUVnH322cydO5dLLrkkon779u3LnDlzuPfee9m5cyctWrSgT58+zJ49m2HDhrny2iS2VNyIiEhI48ePD3jz75133smdd95p+2+FhYW2T07V9/jjj/P44483WD5q1ChGjRoVdN2OHTvy2muvNVheUlLi932g1zBkyBC/MQ4cOJDXX3895Jgleam4kaCysrJYtWpVwNO71QGWodp4vV5H24pFOxERySwqbiSok046iQMHDoRs56RNItuJiLipWbNm9O/f3/bfLMvi5ptvTqt2qcZjOTlfKCIiIpIidM5eRERE0oqKGxEREUkrSXPPzZQpU7jzzju56aabeOSRR2zbLFy4kPPOO6/B8nXr1tGzZ09H/fh8PrZv305ubq5tnolIprIsiwMHDtChQwfdiB2AjlMiiRPOMSopiptly5bxxBNP1ISXhbJ+/XpatmxZ8304ybTbt28PON23iJg05k6dOiV6GElHxymR5ODkGJXw4ubgwYNcddVVPPnkk/zhD39wtE7btm0jnnkyNzcXMG9O3QOPSKYrLS2lc+fONb8jUkvHKZHEC+cYlfDiZuLEiVxyySVceOGFjg8a/fr148iRI/Tq1Yu77rrL9hRwtbKyMsrKymq+r350uGXLljpoiNjQZZCGdJwSSR5OjlEJLW5efvllVqxY0SBNNpD27dvzxBNPcPrpp1NWVsYLL7zABRdcwMKFCznnnHNs15kyZQr333+/m8MWkQyi45RI6knYPDdbt26lf//+zJkzh1NPPRUwU2D37ds34I16di677DI8Hg+zZ8+2/ff6fxFVn9bav3+//iISqaO0tJS8vDz9btSh45RI8gjnGJWwRyI+//xzdu/ezemnn052djbZ2dksWrSIRx99lOzsbMdR9QMHDmTDhg0B/z0nJ6fm1K5O8YpIOHScEklNCbssdcEFF7B69Wq/Zddccw09e/bk9ttvJysry9F2Vq5cSfv27WMxRBHJcDpOiaSmhBU3ubm59OnTx29Z8+bNad26dc3yyZMns23bNqZNmwbAI488QmFhIb1796a8vJzp06czc+ZMZs6cGffxi0j603FKJDUl/GmpYHbs2MG3335b8315eTm33nor27Zto2nTpvTu3Zt33nmHESNG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pBUVNyIiIpJWVNyIiIhIWsm4SfyqJ2QuLS1N8EhEkkv170SGTVqelHScEmkonGNUxhU3Bw4cAKBz584JHolIcjpw4AB5eXmJHkZG03FKJDAnx6iMy5by+Xxs376d3NzcgKF4yaS0tJTOnTuzdevWlM+YSZfXkq6vw7IsDhw4QIcOHfB6dcU6kXScSgy9juQSzTEq487ceL1eOnXqlOhhhK1ly5Yp/UNaV7q8lnR8HTpjkxx0nEosvY7kEskxSn+eiYiISFpRcSMiIiJpRcVNksvJyeHee+8lJycn0UOJWrq8Fr0OEX/p8rOk15FconkdGXdDsYiIiKQ3nbkRERGRtKLiRkRERNKKihsRERFJKypuREREJK2ouElS9913Hx6Px++roKAg0cOKyLZt2xg7diytW7emWbNm9O3bl88//zzRwwpLYWFhg/3h8XiYOHFioocWloqKCu666y66dOlC06ZN6dq1Kw888AA+ny/RQ5MUpONUctFxqlbGzVCcSnr37s28efNqvs/KykrgaCLzww8/cPbZZ3Peeefx3nvv0bZtWzZt2kR+fn6ihxaWZcuWUVlZWfP9mjVrGDp0KGPGjEngqML3pz/9ialTp/L888/Tu3dvli9fzjXXXENeXh433XRToocnKUjHqeSh41QtFTdJLDs7O2X/Cqr2pz/9ic6dO/Pss8/WLCssLEzcgCJ07LHH+n3/8MMP061bN84999wEjSgyxcXFjBo1iksuuQQw+2LGjBksX748wSOTVKXjVPLQcaqWLkslsQ0bNtChQwe6dOnClVdeyTfffJPoIYVt9uzZ9O/fnzFjxtC2bVv69evHk08+mehhRaW8vJzp06dz7bXXpkSoYV2DBg3iww8/5F//+hcAq1atYvHixYwYMSLBI5NUpeNUcsr445QlSendd9+1XnvtNevLL7+05s6da5177rlWu3btrD179iR6aGHJycmxcnJyrMmTJ1srVqywpk6dajVp0sR6/vnnEz20iL3yyitWVlaWtW3btkQPJWw+n8+64447LI/HY2VnZ1sej8f64x//mOhhSYrScSp5ZfpxSsVNijh48KDVrl0763/+538SPZSwNGrUyCoqKvJbNmnSJGvgwIEJGlH0hg0bZl166aWJHkZEZsyYYXXq1MmaMWOG9eWXX1rTpk2zjjnmGOu5555L9NAkDeg4lTwy/Tile25SRPPmzTn55JPZsGFDoocSlvbt29OrVy+/ZSeddBIzZ85M0Iiis2XLFubNm8frr7+e6KFE5L/+67+44447uPLKKwE4+eST2bJlC1OmTOHqq69O8Ogk1ek4lRx0nNI9NymjrKyMdevW0b59+0QPJSxnn30269ev91v2r3/9i+OPPz5BI4rOs88+S9u2bWtudEs1hw4dwuv1/7XPysrSo+DiCh2nkoOOU+iem2T1n//5n9bChQutb775xlqyZIl16aWXWrm5uVZJSUmihxaWpUuXWtnZ2dZDDz1kbdiwwXrxxRetZs2aWdOnT0/00MJWWVlpHXfccdbtt9+e6KFE7Oqrr7Y6duxovf3229bmzZut119/3WrTpo112223JXpokoJ0nEo+Ok4ZKm6S1H/8x39Y7du3txo1amR16NDB+ulPf2qtXbs20cOKyFtvvWX16dPHysnJsXr27Gk98cQTiR5SRD744AMLsNavX5/ooUSstLTUuummm6zjjjvOatKkidW1a1fr97//vVVWVpbooUkK0nEq+eg4ZXgsy7JcPZ8kIiIikkC650ZERETSioobERERSSsqbkRERCStqLgRERGRtKLiRkRERNKKihsRERFJKypuREREJK2ouBEREZG0ouBMidqnn37Kb3/7W9t/u+iii1i+fDl79uyx/felS5cydepUnnnmGdt/v+uuu+jfvz+jR4+2/fdTTjmFadOmRTRuEckMOkZlHhU3ErXS0lJGjx7Nfffd57e8pKSEO+64g4MHD/LFF180WG/IkCH4fD62b9/OI488wpAhQ/z+/bnnnmPPnj0cOXKEvn378txzzzXYxsCBA917ISKSlnSMyjy6LCUiIiJpRcWNiIiIpBUVNyIiIpJWVNyIiIhIWlFxIyIiImlFxY2IiIikFRU3IiIiklZU3IiIiEhaUXEjIiIiaUXFjYiIiKQVxS9I1PLy8nj77bd5++23G/zb8OHD2bdvH/3797dd1+v10qlTJ2699Vbbf7/zzjtp2rQpa9assd3GySefHN3gRSTt6RiVeTyWZVmJHoSIiIiIW3RZSkRERNKKihsRERFJKypuREREJK2ouBEREZG0ouJGRERE0oqKGxEREUkrKm5EREQkrai4ERERkbSi4kZERETSyv8Pur2jO6sVbYkAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib\n",
    "from  sklearn.cluster import KMeans\n",
    "from sklearn.datasets import load_iris\n",
    "\n",
    "#设置 matplotlib rc配置文件\n",
    "matplotlib.rcParams['font.sans-serif'] = [u'SimHei'] # 用来设置字体样式以正常显示中文标签\n",
    "matplotlib.rcParams['axes.unicode_minus'] = False # 设置为 Fasle 来解决负号的乱码问题\n",
    "\n",
    "# 加载鸢尾花数据集\n",
    "# 数据的特征分别是 sepal length(花萼长度)、sepal width(花萼宽度)、petal length（花瓣长度）、petal width（花瓣宽度）\n",
    "iris = load_iris()\n",
    "print(iris)\n",
    "X = iris.data[:, :2]  # 通过花萼的两个特征（长度和宽度）来聚类\n",
    "k = 3  # 假设聚类为 3 类，默认分为 8 个 簇\n",
    "\n",
    "print(X.shape)\n",
    "print(X[0])\n",
    "\n",
    "# 构建算法模型\n",
    "km = KMeans(n_clusters=k) # n_clusters参数表示分成几个簇（此处k=3）\n",
    "km.fit(X)\n",
    "\n",
    "# 获取聚类后样本所属簇的对应编号（label_pred）\n",
    "label_pred = km.labels_  # labels_属性表示每个点的分簇号，会得到一个关于簇编号的数组\n",
    "centroids = km.cluster_centers_  #cluster_center 属性用来获取簇的质心点，得到一个关于质心的二维数组，形如[[x1,y1],[x2,y2],[x3,x3]]\n",
    "\n",
    "# 未聚类前的数据分布图\n",
    "plt.subplot(121)\n",
    "plt.scatter(X[:, 0], X[:, 1], s=50)\n",
    "plt.xlabel('花萼长度')\n",
    "plt.ylabel('花萼宽度')\n",
    "plt.title(\"未聚类之前\")\n",
    "# wspace 两个子图之间保留的空间宽度\n",
    "plt.subplots_adjust(wspace=0.5) # subplots_adjust（）用于调整边距和子图间距\n",
    "# 聚类后的分布图\n",
    "plt.subplot(122)\n",
    "# c：表示颜色和色彩序列，此处与 cmap 颜色映射一起使用（cool是颜色映射值）s表示散点的的大小，marker表示标记样式（散点样式）\n",
    "plt.scatter(X[:, 0], X[:, 1], c=label_pred, s=50, cmap='cool')\n",
    "# 绘制质心点\n",
    "plt.scatter(centroids[:,0],centroids[:,1],c='red',marker='o',s=100)\n",
    "plt.xlabel('花萼长度')\n",
    "plt.ylabel('花萼宽度')\n",
    "plt.title(\"K-Means算法聚类结果\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
